home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / mtools.lha / mtools-2.0.7 / mtype.c < prev    next >
C/C++ Source or Header  |  1992-09-10  |  3KB  |  147 lines

  1. /*
  2.  * Display contents of an MSDOS file
  3.  *
  4.  * Emmet P. Gray            US Army, HQ III Corps & Fort Hood
  5.  * ...!uunet!uiucuxc!fthood!egray    Attn: AFZF-DE-ENV
  6.  * fthood!egray@uxc.cso.uiuc.edu    Directorate of Engineering & Housing
  7.  *                     Environmental Management Office
  8.  *                     Fort Hood, TX 76544-5057
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "msdos.h"
  13. #include "patchlevel.h"
  14.  
  15. int fd = -1;                /* the file descriptor for the device */
  16. int dir_start;                /* starting sector for directory */
  17. int dir_len;                /* length of directory (in sectors) */
  18. int dir_entries;            /* number of directory entries */
  19. int clus_size;                /* cluster size (in sectors) */
  20. char *mcwd;                /* the Current Working Directory */
  21. int fat_error;                /* FAT error detected? */
  22.  
  23. main(argc, argv)
  24. int argc;
  25. char *argv[];
  26. {
  27.     extern int optind;
  28.     extern char *optarg;
  29.     int i, ismatch, entry, c, oops, textmode, stripmode, got_one;
  30.     int missed_one;
  31.     unsigned int fat;
  32.     long size;
  33.     char *filename, *newfile, *get_name(), *unix_name(), *pathname;
  34.     char *get_path(), drive, get_drive(), last_drive, *fix_mcwd();
  35.     void exit();
  36.     struct directory *dir, *dir_read();
  37.  
  38.                     /* get command line options */
  39.     oops = 0;
  40.     stripmode = 0;
  41.     textmode = 0;
  42.     got_one = 0;
  43.     missed_one = 0;
  44.     while ((c = getopt(argc, argv, "st")) != EOF) {
  45.         switch (c) {
  46.             case 's':
  47.                 stripmode = 1;
  48.                 break;
  49.             case 't':
  50.                 textmode = 1;
  51.                 break;
  52.             default:
  53.                 oops = 1;
  54.                 break;
  55.         }
  56.     }
  57.  
  58.     if (oops || (argc - optind) < 1) {
  59.         fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  60.         fprintf(stderr, "Usage: %s [-st] msdosfile [msdosfiles...]\n", argv[0]);
  61.         exit(1);
  62.     }
  63.     last_drive = 'x';
  64.     mcwd = fix_mcwd();
  65.  
  66.     for (i = optind; i < argc; i++) {
  67.         drive = get_drive(argv[i]);
  68.         if (drive != last_drive) {
  69.             if (init(drive, 0)) {
  70.                 fprintf(stderr, "%s: Cannot initialize '%c:'\n", argv[0], drive);
  71.                 missed_one++;
  72.                 continue;
  73.             }
  74.             last_drive = drive;
  75.         }
  76.         filename = get_name(argv[i]);
  77.         pathname = get_path(argv[i]);
  78.         if (subdir(drive, pathname)) {
  79.             missed_one++;
  80.             continue;
  81.         }
  82.  
  83.         ismatch = 0;
  84.         for (entry = 0; entry < dir_entries; entry++) {
  85.             dir = dir_read(entry);
  86.                     /* if empty */
  87.             if (dir->name[0] == 0x0)
  88.                 break;
  89.                     /* if erased */
  90.             if (dir->name[0] == 0xe5)
  91.                 continue;
  92.                     /* if dir or volume label */
  93.             if ((dir->attr & 0x10) || (dir->attr & 0x08))
  94.                 continue;
  95.  
  96.             newfile = unix_name(dir->name, dir->ext);
  97.  
  98.                     /* see it if matches the pattern */
  99.             if (match(newfile, filename)) {
  100.                 fat = dir->start[1] * 0x100 + dir->start[0];
  101.                 size = dir->size[3] * 0x1000000L + dir->size[2] * 0x10000L + dir->size[1] * 0x100 + dir->size[0];
  102.                 if (file_read(stdout, fat, textmode, stripmode, size))
  103.                     break;
  104.                 ismatch = 1;
  105.                 got_one++;
  106.             }
  107.         }
  108.         if (fat_error) {
  109.             missed_one++;
  110.             break;
  111.         }
  112.  
  113.         if (!ismatch) {
  114.             fprintf(stderr, "%s: File \"%s\" not found\n", argv[0], filename);
  115.             missed_one++;
  116.         }
  117.     }
  118.     close(fd);
  119.     if (got_one && missed_one)
  120.         exit(2);
  121.     if (missed_one)
  122.         exit(1);
  123.     exit(0);
  124. }
  125.  
  126. /*
  127.  * stubs for read-only programs
  128.  */
  129.  
  130. void
  131. disk_flush()
  132. {
  133.     extern int disk_dirty;
  134.  
  135.     disk_dirty = 0;
  136.     return;
  137. }
  138.  
  139. void
  140. dir_flush()
  141. {
  142.     extern int dir_dirty;
  143.  
  144.     dir_dirty = 0;
  145.     return;
  146. }
  147.